package br.unifor.cg.algoritmos;

import br.unifor.cg.formas.Ponto;

/**
 * Classe que implementa o algoritmo de Bresenham Inteiro
 *
 */
public class BresenhamInteiro extends Algoritmo{

	/**
	 * Metodo foi sobrescrito para utilizar o algoritmo de Bresenhan Inteiro
	 */
	public void desenhaLinha(Ponto pInicial, Ponto pFinal) {
		double x = pInicial.getX();
		double y = pInicial.getY();
		double deltaX, deltaY,s1,s2,tmp = 0;
		double e = 0;
		deltaX = Math.abs(pFinal.getX() - pInicial.getX());
		deltaY = Math.abs(pFinal.getY() - pInicial.getY());
		s1 = Math.signum(pFinal.getX() - pInicial.getX());
		s2 = Math.signum(pFinal.getY() - pInicial.getY());
		boolean trocaInclinacao = false;
		
		if (s1 < 0)
			x -= 1;
		if (s2 < 0)
			y -= 1;
		
		if(deltaY > deltaX){
			tmp = deltaX;
			deltaX=deltaY;
			deltaY=tmp;
			trocaInclinacao=true;
		}
		
			
		e = 2* deltaY - deltaX;

		for (int i = 0; i <= (int) Math.round(deltaX); i++) {
			
			desenhaPonto((int) Math.round(x), (int) Math.round(y));
			
			while (e >= 0) {

				if(trocaInclinacao)
					x = x + s1;
				else
					y = y + s2;
				
				e = e - 2*deltaX;
				
			}
			
			if(trocaInclinacao)
				y = y + s2;
			else
				x = x + s1;
			
			e = e + 2*deltaY;
		}
	}

}
